export default abstract class ChannelBase {
    /**
     * 插屏广告id app广告媒体id
     */
    protected appid: string;

    //#region 广告id
    /**
     * 插屏广告id
     */
    protected page_id_list: Array<string>;
    /**
     * 视频广告id
     */
    protected video_id_list: Array<string>;
    /**
     * banner广告id
     */
    protected banner_id_list: Array<string>;
    /**
     * 盒子广告id
     */
    protected box_id_list: Array<string>;
    /**
     * 积木广告id
     */
    protected juggle_id_list: Array<string>;
    /**
     * 原生广告id
     */
    protected native_id_list: Array<string>;
    //#endregion 广告id

    //#region 广告回调
    /**
     * 插屏展示失败回调
     */
    protected page_failed;
    /**
     * 插屏展示成功回调
     */
    protected page_successed;

    /**
     * 视频展示失败回调
     */
    public video_failed;
    /**
     * 视频展示成功回调
     */
    public video_successed;

    /**
     * banner展示失败回调
     */
    protected banner_failed;
    /**
     * banner展示成功回调
     */
    protected banner_successed;

    /**
     * 盒子广告展示失败
     */
    protected box_failed;
    /**
     * 盒子广告展示成功
     */
    protected box_successed;

    /**
     * 积木广告展示失败
     */
    protected juggle_failed;
    /**
     * 积木广告展示成功
     */
    protected juggle_successed;

    /**
     * 原生展示失败回调
     */
    protected native_failed;
    /**
     * 原生展示成功回调
     */
    protected native_successed;
    //#endregion 广告回调

    //#region 广告对象
    /**
     * 插屏广告对象
     */
    protected page_obj: any = null;
    /**
     * 视频广告对象
     */
    protected video_obj: any = null;
    /**
     * 横幅广告对象
     */
    protected banner_obj: any = null;
    /**
     * 盒子广告对象
     */
    protected box_obj: any = null;
    /**
     * 积木广告对象
     */
    protected juggle_obj: any = null;
    /**
     * 原生广告对象
     */
    protected native_obj: any = null;
    //#endregion 广告对象

    //#region 开关
    /**
     * 是否包含广告
     */
    public is_has_ad: boolean = false;//广告开关
    /**
     * 是否包含插屏广告
     */
    public is_has_page: boolean = true;
    /**
     * 是否包含banner广告
     */
    public is_has_banner: boolean = true;
    /**
     * 是否包含原生广告
     */
    public is_has_native: boolean = false;
    /**
     * 是否包含盒子广告
     */
    public is_has_box: boolean = false;
    /**
     * 是否包含积木广告
     */
    public is_has_jm: boolean = false;
    /**
     * 是否包含录屏
     */
    public is_has_recorder: boolean = false;
    /**
     * 是否包含分享
     */
    public is_has_share: boolean = true;
    /**
     * 是否包含退出
     */
    public is_has_exit: boolean = false;
    //#endregion

    /**
     * 横幅广告高度
     */
    public banner_height: number = 300;

    /**
     * 初始化
     * @param appid app广告媒体id 没有则传appid
     * @param video_id_list 视频广告id
     * @param page_id_list 插屏广告id
     * @param banner_id_list banner广告id
     * @param box_id_list 视频广告id
     * @param juggle_id_list banner广告id
     * @param native_id_list 原生广告id
     */
    constructor(appid: string, video_id_list: Array<string>, page_id_list: Array<string>, banner_id_list: Array<string>, box_id_list: Array<string>, juggle_id_list: Array<string>, native_id_list: Array<string>) {
        this.appid = appid;
        this.page_id_list = page_id_list;
        this.video_id_list = video_id_list;
        this.banner_id_list = banner_id_list;
        this.box_id_list = box_id_list;
        this.juggle_id_list = juggle_id_list;
        this.native_id_list = native_id_list;
        this.InitChannel();
        console.log('-------->渠道对象实例化<--------');
    }

    /**
     * 初始化渠道
     */
    protected abstract InitChannel();

    //#region 广告相关
    /**
     * 创建插屏广告
     */
    public abstract CreatePage();
    /**
     * 展示插屏广告
     */
    public abstract ShowPage(on_successed: Function, on_failed: Function);

    /**
     * 创建视频广告
     */
    public abstract CreateVideo();
    /**
     * 展示视频广告
     */
    public abstract ShowVideo(on_successed: Function, on_failed: Function);

    /**
     * 展示banner广告
     */
    public abstract ShowBanner(on_successed: Function, on_failed: Function);
    /**
     * 隐藏banner广告
     */
    public abstract HideBanner();

    /**
     * banner广告对象是否为NULL
     */
    public isBanner(): boolean {
        return this.banner_obj != null && this.banner_obj != undefined;
    };

    /**
     * 创建盒子广告
     */
    public abstract CreateBox();
    /**
     * 显示盒子广告
     */
    public abstract ShowBox(on_successed: Function, on_failed: Function);
    /**
     * 隐藏盒子广告
     */
    public abstract HideBox();

    /**
     * 创建积木广告
     */
    public abstract CreateJuggle();
    /**
     * 显示积木广告
     */
    public abstract ShowJuggle(on_successed: Function, on_failed: Function);
    /**
     * 隐藏积木广告
     */
    public abstract HideJuggle();

    /**
     * 创建原生广告
     */
    public abstract CreateNative();
    /**
    * 展示原生广告
    */
    public abstract ShowNative(on_successed: Function, on_failed: Function);
    /**
    * 隐藏原生广告
    */
    public abstract HideNative();
    //#endregion 广告相关

    //#region 分享/录屏相关 
    /**
     * 分享游戏
     */
    public abstract ShareGame();

    /**
     * 开始录屏
     */
    public abstract StartRecord();
    /**
     * 停止录屏
     */
    public abstract StopRecord(on_stop: Function);
    /**
     * 分享录屏
     */
    public abstract ShareRecord(on_successed: Function, on_failed: Function);
    //#endregion 分享/录屏相关

    /**
     * 获取设备信息
     */
    public abstract GetSystemInfo();

    /*
     * 短震动
     */
    public abstract VibrateShort();

    /*
     * 长震动
     */
    public abstract VibrateLong();

    /**
     * 打开另一个小程序
     * @param target 目标小程序appid
     * @param path 打开的页面路径
     * @param extraData 需要传递给目标小程序的数据
     * @param ON_SUCCESS 成功回调
     * @param ON_FAILED 失败回调
     * @param is_developer envVersion 的合法值是否为 develop(开发版)
     */
    public abstract NavigateToMiniProgram(target: string, path: string, extraData: object, ON_SUCCESS: Function, ON_FAILED: Function, is_developer: boolean);

    /**
     * 获取当前时间戳
     * @param isMicrosecond 是否获取毫秒级时间戳
     */
    public GetCurrentTimestamp(isMicrosecond: boolean) {
        let ts: number = (new Date).getTime();
        if (isMicrosecond) {
            return ts;
        } else {
            return Math.floor(ts * 0.001);
        }
    }

    //#region 生命周期
    public abstract OnShow(callback: Function);
    public abstract OnHide(callback: Function);
    public abstract OffShow(callback: Function);
    public abstract OffHide(callback: Function);
    public abstract GetLaunchOptionsSync(): any;
    public abstract GetEnterOptionsSync(): any;
    public abstract ExitMiniProgram(on_successed: Function, on_failed: Function, on_complete: Function);
    //#endregion 生命周期
}
